From 430d2e106d329b19167290281e92d14279051b2f Mon Sep 17 00:00:00 2001 From: "bd240@boulderdash.cl.cam.ac.uk" Date: Sun, 26 Jan 2003 11:30:17 +0000 Subject: [PATCH] bitkeeper revision 1.17 (3e33c6c930lVm278ebyafgyZR0Wnvg) domain building code --- xen-2.4.16/common/dom0_ops.c | 30 +++++ xen-2.4.16/common/domain.c | 77 ++++++++---- xen-2.4.16/common/memory.c | 118 ++++++++++++++++++ xen-2.4.16/include/xeno/dom0_ops.h | 9 +- .../arch/xeno/drivers/dom0/dom0_core.c | 61 +++++---- .../arch/xeno/drivers/dom0/dom0_memory.c | 12 -- .../arch/xeno/drivers/dom0/dom0_ops.h | 15 ++- 7 files changed, 251 insertions(+), 71 deletions(-) diff --git a/xen-2.4.16/common/dom0_ops.c b/xen-2.4.16/common/dom0_ops.c index a554e11a51..31d0b992a8 100644 --- a/xen-2.4.16/common/dom0_ops.c +++ b/xen-2.4.16/common/dom0_ops.c @@ -13,6 +13,7 @@ #include #include #include +#include extern unsigned int alloc_new_dom_mem(struct task_struct *, unsigned int); @@ -30,6 +31,28 @@ static unsigned int get_domnr(void) return (dom_mask == ~0UL) ? 0 : ffz(dom_mask); } +static void build_page_list(struct task_struct *p) +{ + unsigned long * list; + unsigned long curr; + unsigned long page; + + list = (unsigned long *)map_domain_mem(p->pg_head << PAGE_SHIFT); + curr = p->pg_head; + *list++ = p->pg_head; + page = (frame_table + p->pg_head)->next; + printk(KERN_ALERT "bd240 debug: list %lx, page num %lx\n", list, page); + while(page != p->pg_head){ + if(!((unsigned long)list & (PAGE_SIZE-1))){ + printk(KERN_ALERT "bd240 debug: list %lx, page num %lx\n", list, page); + curr = (frame_table + curr)->next; + list = (unsigned long *)map_domain_mem(curr << PAGE_SHIFT); + } + *list++ = page; + page = (frame_table + page)->next; + } +} + long do_dom0_op(dom0_op_t *u_dom0_op) { long ret = 0; @@ -80,7 +103,14 @@ long do_dom0_op(dom0_op_t *u_dom0_op) ret = -1; break; } + build_page_list(p); ret = p->domain; + + op.u.newdomain.domain = ret; + op.u.newdomain.pg_head = p->pg_head; + copy_to_user(u_dom0_op, &op, sizeof(op)); + printk(KERN_ALERT "bd240 debug: hyp dom0_ops: %lx, %d\n", op.u.newdomain.pg_head, op.u.newdomain.memory_kb); + break; } diff --git a/xen-2.4.16/common/domain.c b/xen-2.4.16/common/domain.c index ae78a25c59..7ccf9501d0 100644 --- a/xen-2.4.16/common/domain.c +++ b/xen-2.4.16/common/domain.c @@ -17,6 +17,8 @@ #define L2_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED) #define L1_PROT (_PAGE_PRESENT|_PAGE_RW|_PAGE_USER|_PAGE_ACCESSED|_PAGE_DIRTY) +extern int new_do_process_page_updates(page_update_request_t *, int); + extern int nr_mods; extern module_t *mod; extern unsigned char *cmdline; @@ -336,7 +338,7 @@ asmlinkage void schedule(void) } -static unsigned int alloc_new_dom_mem(struct task_struct *p, unsigned int kbytes) +unsigned int alloc_new_dom_mem(struct task_struct *p, unsigned int kbytes) { struct list_head *temp; struct pfn_info *pf, *pf_head; @@ -352,7 +354,6 @@ static unsigned int alloc_new_dom_mem(struct task_struct *p, unsigned int kbytes /* allocate pages and build a thread through frame_table */ temp = free_list.next; - printk("bd240 debug: DOM%d requesting %d pages\n", p->domain, req_pages); /* allocate first page */ pf = list_entry(temp, struct pfn_info, list); @@ -390,22 +391,51 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo) start_info_t * virt_startinfo_addr; unsigned long virt_stack_addr; unsigned long long time; + unsigned long phys_l1tab, phys_l2tab; + page_update_request_t * pgt_updates; + unsigned long count; net_ring_t *net_ring; + net_vif_t *net_vif; char *dst; // temporary int i; // temporary + /* first of all, set up domain pagetables */ + pgt_updates = (page_update_request_t *) + map_domain_mem(meminfo->pgt_update_arr); + printk(KERN_ALERT "bd240 debug: update request starting virt %lx, phys %lx\n", pgt_updates, meminfo->pgt_update_arr); + for(count = 0; count < meminfo->num_pgt_updates; count++){ + printk(KERN_ALERT "bd240 debug: update pair %lx, %lx\n", pgt_updates->ptr, pgt_updates->val); + new_do_process_page_updates(pgt_updates, 1); + pgt_updates++; + if(!((unsigned long)pgt_updates & (PAGE_SIZE-1))){ + pgt_updates--; + pgt_updates = (page_update_request_t *)map_domain_mem( + ((frame_table + ((unsigned long)pgt_updates >> + PAGE_SHIFT))->next) << PAGE_SHIFT); + } + } + /* entries 0xe0000000 onwards in page table must contain hypervisor * mem mappings - set them up. */ - l2tab = (l2_pgentry_t *)__va(meminfo->l2_pgt_addr); + phys_l2tab = meminfo->l2_pgt_addr; + l2tab = map_domain_mem(phys_l2tab); memcpy(l2tab + DOMAIN_ENTRIES_PER_L2_PAGETABLE, - ((l2_pgentry_t *)idle0_pg_table) + DOMAIN_ENTRIES_PER_L2_PAGETABLE, - (ENTRIES_PER_L2_PAGETABLE - DOMAIN_ENTRIES_PER_L2_PAGETABLE) * sizeof(l2_pgentry_t)); - p->mm.pagetable = mk_pagetable((unsigned long)l2tab); + ((l2_pgentry_t *)idle_pg_table[p->processor]) + + DOMAIN_ENTRIES_PER_L2_PAGETABLE, + (ENTRIES_PER_L2_PAGETABLE - DOMAIN_ENTRIES_PER_L2_PAGETABLE) + * sizeof(l2_pgentry_t)); + l2tab[PERDOMAIN_VIRT_START >> L2_PAGETABLE_SHIFT] = + mk_l2_pgentry(__pa(p->mm.perdomain_pt) | PAGE_HYPERVISOR); + p->mm.pagetable = mk_pagetable(phys_l2tab); /* map in the shared info structure */ - l2tab = pagetable_ptr(p->mm.pagetable) + l2_table_offset(meminfo->virt_shinfo_addr); - l1tab = l2_pgentry_to_l1(*l2tab) + l1_table_offset(meminfo->virt_shinfo_addr); + phys_l2tab = pagetable_val(p->mm.pagetable) + + (l2_table_offset(meminfo->virt_shinfo_addr) * sizeof(l2_pgentry_t)); + l2tab = map_domain_mem(phys_l2tab); + phys_l1tab = l2_pgentry_to_phys(*l2tab) + + (l1_table_offset(meminfo->virt_shinfo_addr) * sizeof(l1_pgentry_t)); + l1tab = map_domain_mem(phys_l1tab); *l1tab = mk_l1_pgentry(__pa(p->shared_info) | L1_PROT); /* set up the shared info structure */ @@ -422,9 +452,8 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo) * new domain. thus, temporarely install its pagetables. */ __cli(); - __asm__ __volatile__ ( - "mov %%eax, %%cr3" - : : "a" (__pa(pagetable_ptr(p->mm.pagetable)))); + __asm__ __volatile__ ( + "mov %%eax,%%cr3" : : "a" (pagetable_val(p->mm.pagetable))); memset(virt_startinfo_addr, 0, sizeof(virt_startinfo_addr)); virt_startinfo_addr->nr_pages = p->tot_pages; @@ -439,26 +468,20 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo) /* Add virtual network interfaces and point to them in startinfo. */ while (meminfo->num_vifs-- > 0) { - net_ring = create_net_vif(p->domain); + net_vif = create_net_vif(p->domain); + net_ring = net_vif->net_ring; if (!net_ring) panic("no network ring!\n"); } - virt_startinfo_addr->net_rings = p->net_ring_base; + +/* XXX SMH: horrible hack to convert hypervisor VAs in SHIP to guest VAs */ +#define SH2G(_x) (meminfo->virt_shinfo_addr | (((unsigned long)(_x)) & 0xFFF)) + + virt_startinfo_addr->net_rings = (net_ring_t *)SH2G(p->net_ring_base); virt_startinfo_addr->num_net_rings = p->num_net_vifs; /* Add block io interface */ - virt_startinfo_addr->blk_ring = p->blk_ring_base; + virt_startinfo_addr->blk_ring = (blk_ring_t *)SH2G(p->blk_ring_base); - /* i do not think this has to be done any more, temporary */ - /* We tell OS about any modules we were given. */ - if ( nr_mods > 1 ) - { - virt_startinfo_addr->mod_start = - (mod[1].mod_start-mod[0].mod_start-12) + meminfo->virt_load_addr; - virt_startinfo_addr->mod_len = - mod[nr_mods-1].mod_end - mod[1].mod_start; - } - - /* temporary, meminfo->cmd_line just needs to be copied info start info */ dst = virt_startinfo_addr->cmd_line; if ( mod[0].string ) { @@ -489,10 +512,10 @@ int final_setup_guestos(struct task_struct * p, dom_meminfo_t * meminfo) /* Reinstate the caller's page tables. */ __asm__ __volatile__ ( - "mov %%eax,%%cr3" - : : "a" (__pa(pagetable_ptr(current->mm.pagetable)))); + "mov %%eax,%%cr3" : : "a" (pagetable_val(current->mm.pagetable))); __sti(); + new_thread(p, (unsigned long)meminfo->virt_load_addr, (unsigned long)virt_stack_addr, diff --git a/xen-2.4.16/common/memory.c b/xen-2.4.16/common/memory.c index 226772ebce..6c8deafff9 100644 --- a/xen-2.4.16/common/memory.c +++ b/xen-2.4.16/common/memory.c @@ -757,6 +757,11 @@ int do_process_page_updates(page_update_request_t *updates, int count) if ( err ) { + page = frame_table + (cur.ptr >> PAGE_SHIFT); + printk(KERN_ALERT "bd240 debug: Update request %d\n", cur.ptr & (sizeof(l1_pgentry_t) - 1)); + printk(KERN_ALERT "bd240 debug: Update request %lx, %lx\n", cur.ptr, cur.val); + printk(KERN_ALERT "bd240 debug: Page flags %lx\n", page->flags); + kill_domain_with_errmsg("Illegal page update request"); } @@ -774,3 +779,116 @@ int do_process_page_updates(page_update_request_t *updates, int count) return(0); } +/* Apply updates to page table @pagetable_id within the current domain. */ +int new_do_process_page_updates(page_update_request_t * cur, int count) +{ + unsigned long flags, pfn; + struct pfn_info *page; + int err = 0, i; + + for ( i = 0; i < count; i++ ) + { + pfn = cur->ptr >> PAGE_SHIFT; + if ( pfn >= max_page ) + { + MEM_LOG("Page out of range (%08lx > %08lx)", pfn, max_page); + kill_domain_with_errmsg("Page update request out of range"); + } + + err = 1; + + /* Least significant bits of 'ptr' demux the operation type. */ + switch ( cur->ptr & (sizeof(l1_pgentry_t)-1) ) + { + + /* + * PGREQ_NORMAL: Normal update to any level of page table. + */ + case PGREQ_NORMAL: + page = frame_table + pfn; + flags = page->flags; + + printk(KERN_ALERT "bd240 debug: normal update\n"); + + if ( (flags & PG_domain_mask) == current->domain ) + { + printk(KERN_ALERT "bd240 debug: normal update inside\n"); + switch ( (flags & PG_type_mask) ) + { + case PGT_l1_page_table: + err = mod_l1_entry(cur->ptr, mk_l1_pgentry(cur->val)); + break; + case PGT_l2_page_table: + err = mod_l2_entry(cur->ptr, mk_l2_pgentry(cur->val)); + break; + default: + MEM_LOG("Update to non-pt page %08lx", cur->ptr); + break; + } + } + + printk(KERN_ALERT "bd240 debug: normal update finish\n"); + + break; + + /* + * PGREQ_UNCHECKED_UPDATE: Make an unchecked update to a + * bottom-level page-table entry. + * Restrictions apply: + * 1. Update only allowed by domain 0. + * 2. Update must be to a level-1 pte belonging to dom0. + */ + case PGREQ_UNCHECKED_UPDATE: + cur->ptr &= ~(sizeof(l1_pgentry_t) - 1); + page = frame_table + pfn; + flags = page->flags; + if ( (flags | current->domain) == PGT_l1_page_table ) + { + + *(unsigned long *)map_domain_mem(cur->ptr) = cur->val; + err = 0; + } + else + { + MEM_LOG("UNCHECKED_UPDATE: Bad domain %d, or" + " bad pte type %08lx", current->domain, flags); + } + break; + + /* + * PGREQ_EXTENDED_COMMAND: Extended command is specified + * in the least-siginificant bits of the 'value' field. + */ + case PGREQ_EXTENDED_COMMAND: + cur->ptr &= ~(sizeof(l1_pgentry_t) - 1); + err = do_extended_command(cur->ptr, cur->val); + break; + + default: + MEM_LOG("Invalid page update command %08lx", cur->ptr); + break; + } + + if ( err ) + { + page = frame_table + (cur->ptr >> PAGE_SHIFT); + printk(KERN_ALERT "bd240 debug: Update request %lx\n", cur->ptr & (sizeof(l1_pgentry_t) - 1)); + printk(KERN_ALERT "bd240 debug: Update request %lx, %lx\n", cur->ptr, cur->val); + printk(KERN_ALERT "bd240 debug: Page flags %lx\n", page->flags); + + kill_domain_with_errmsg("Illegal page update request"); + } + + cur++; + } + + if ( tlb_flush[smp_processor_id()] ) + { + tlb_flush[smp_processor_id()] = 0; + __asm__ __volatile__ ( + "movl %%eax,%%cr3" : : + "a" (pagetable_val(current->mm.pagetable))); + } + + return(0); +} diff --git a/xen-2.4.16/include/xeno/dom0_ops.h b/xen-2.4.16/include/xeno/dom0_ops.h index fd4b436f2b..018bde61ae 100644 --- a/xen-2.4.16/include/xeno/dom0_ops.h +++ b/xen-2.4.16/include/xeno/dom0_ops.h @@ -19,9 +19,10 @@ typedef struct dom0_newdomain_st { - unsigned int memory_kb; + unsigned int domain; // return parameter + unsigned int memory_kb; unsigned int num_vifs; // temporary - unsigned int domain; + unsigned long pg_head; // return parameter } dom0_newdomain_t; typedef struct dom0_killdomain_st @@ -37,11 +38,13 @@ typedef struct dom0_map_ts typedef struct domain_launch { - unsigned long domain; + unsigned int domain; unsigned long l2_pgt_addr; unsigned long virt_load_addr; unsigned long virt_shinfo_addr; unsigned long virt_startinfo_addr; + unsigned long pgt_update_arr; + unsigned long num_pgt_updates; unsigned int num_vifs; char cmd_line[MAX_CMD_LEN]; } dom_meminfo_t; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c index b7e087a16d..050afa5d92 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_core.c @@ -35,7 +35,7 @@ #define XENO_BASE "xeno" // proc file name defs should be in separate .h #define DOM0_CMD_INTF "dom0_cmd" #define DOM0_FT "frame_table" -#define DOM0_NEWDOM "new_dom_id" +#define DOM0_NEWDOM "new_dom_data" #define MAX_LEN 16 #define DOM_DIR "dom" @@ -148,13 +148,13 @@ static void create_proc_dom_entries(int dom) static ssize_t dom_mem_write(struct file * file, const char * buff, size_t size , loff_t * off) { - unsigned long addr; - proc_memdata_t * mem_data = (proc_memdata_t *)((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data; + dom_mem_t mem_data; - copy_from_user(&addr, (unsigned long *)buff, sizeof(addr)); + copy_from_user(&mem_data, (dom_mem_t *)buff, sizeof(dom_mem_t)); - if(direct_disc_unmap(addr, mem_data->pfn, mem_data->tot_pages) == 0){ - return sizeof(addr); + if(direct_disc_unmap(mem_data.vaddr, mem_data.start_pfn, + mem_data.tot_pages) == 0){ + return sizeof(sizeof(dom_mem_t)); } else { return -1; } @@ -172,14 +172,10 @@ static ssize_t dom_mem_read(struct file * file, char * buff, size_t size, loff_t /* remap the range using xen specific routines */ addr = direct_mmap(mem_data->pfn << PAGE_SHIFT, mem_data->tot_pages << PAGE_SHIFT, prot, 0, 0); - printk(KERN_ALERT "bd240 debug: dom_mem_read: %lx, %lx @ %lx\n", mem_data->pfn << PAGE_SHIFT, mem_data->tot_pages << PAGE_SHIFT, addr); copy_to_user((unsigned long *)buff, &addr, sizeof(addr)); - printk(KERN_ALERT "bd240 debug: exiting dom_mem_read\n"); - return sizeof(addr); - } struct file_operations dom_mem_ops = { @@ -218,8 +214,6 @@ static int dom_map_mem(unsigned int dom, unsigned long pfn, int tot_pages) memdata->tot_pages = tot_pages; file->data = memdata; - printk(KERN_ALERT "bd240 debug: cmd setup dom mem: %lx, %d\n", memdata->pfn, memdata->tot_pages); - ret = 0; break; } @@ -232,23 +226,33 @@ static int dom_map_mem(unsigned int dom, unsigned long pfn, int tot_pages) return ret; } -/* return dom id stored as data pointer to userspace */ -static int dom_id_read_proc(char *page, char **start, off_t off, - int count, int *eof, void *data) +/* function used to retrieve data associated with new domain */ +static ssize_t dom_data_read(struct file * file, char * buff, size_t size, loff_t * off) { - char arg[16]; - sprintf(arg, "%d", (int)data); - strcpy(page, arg); + dom0_newdomain_t * dom_data = (dom0_newdomain_t *) + ((struct proc_dir_entry *)file->f_dentry->d_inode->u.generic_ip)->data; + + copy_to_user((dom0_newdomain_t *)buff, dom_data, sizeof(dom0_newdomain_t)); + remove_proc_entry(DOM0_NEWDOM, xeno_base); - return sizeof(unsigned int); + + kfree(dom_data); + + return sizeof(dom0_newdomain_t); } +struct file_operations newdom_data_fops = { + read: dom_data_read, +}; + static int cmd_write_proc(struct file *file, const char *buffer, u_long count, void *data) { dom0_op_t op; int ret = 0; struct proc_dir_entry * new_dom_id; + dom0_newdomain_t * params; + copy_from_user(&op, buffer, sizeof(dom0_op_t)); @@ -260,28 +264,38 @@ static int cmd_write_proc(struct file *file, const char *buffer, /* is the request intended for hypervisor? */ if(op.cmd != MAP_DOM_MEM){ + ret = HYPERVISOR_dom0_op(&op); /* if new domain created, create proc entries */ if(op.cmd == DOM0_NEWDOMAIN){ create_proc_dom_entries(ret); + params = (dom0_newdomain_t *)kmalloc(sizeof(dom0_newdomain_t), + GFP_KERNEL); + params->memory_kb = op.u.newdomain.memory_kb; + params->pg_head = op.u.newdomain.pg_head; + params->num_vifs = op.u.newdomain.num_vifs; + params->domain = op.u.newdomain.domain; + + printk(KERN_ALERT "bd240 debug: cmd_write: %lx, %d, %d\n", params->pg_head, params->memory_kb, params->domain); + /* now notify user space of the new domain's id */ new_dom_id = create_proc_entry(DOM0_NEWDOM, 0600, xeno_base); if ( new_dom_id != NULL ) { new_dom_id->owner = THIS_MODULE; new_dom_id->nlink = 1; - new_dom_id->read_proc = dom_id_read_proc; - new_dom_id->data = (void *)ret; + new_dom_id->proc_fops = &newdom_data_fops; + new_dom_id->data = (void *)params; } } } else { - ret = dom_map_mem(op.u.reqdommem.domain, op.u.reqdommem.start_pfn, - op.u.reqdommem.tot_pages); + ret = dom_map_mem(op.u.dommem.domain, op.u.dommem.start_pfn, + op.u.dommem.tot_pages); } out: @@ -324,7 +338,6 @@ struct file_operations ft_ops = { static int __init init_module(void) { - frame_table = (frame_table_t *)start_info.frame_table; frame_table_len = start_info.frame_table_len; frame_table_pa = start_info.frame_table_pa; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c index ecedd58758..1f62cbda7c 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_memory.c @@ -55,9 +55,6 @@ static inline void direct_remappte_range(pte_t * pte, unsigned long address, uns do { pte_t oldpage; oldpage = ptep_get_and_clear(pte); - /* - printk(KERN_ALERT "bd240 debug: %lx - %lx\n", pte, phys_addr); - */ direct_set_pte(pte, direct_mk_pte_phys(phys_addr, prot)); forget_pte(oldpage); @@ -184,10 +181,8 @@ unsigned long direct_mmap(unsigned long phys_addr, unsigned long size, entry = find_direct(¤t->mm->context.direct_list, addr); if(entry != ¤t->mm->context.direct_list){ list_add_tail(&dmmap->list, entry); - printk(KERN_ALERT "bd240 debug: added node %lx, size %lx in the middle\n", dmmap->vm_start, size); } else { list_add_tail(&dmmap->list, ¤t->mm->context.direct_list); - printk(KERN_ALERT "bd240 debug: added node %lx, size %lx at tail\n", dmmap->vm_start, size); } /* and perform the mapping */ @@ -321,7 +316,6 @@ int direct_unmap(unsigned long addr, unsigned long size) return -1; list_del(&node->list); - printk(KERN_ALERT "bd240 debug: delisted %lx from dlist\n", node->vm_start); kfree(node); direct_zap_page_range(current->mm, addr, size); @@ -336,8 +330,6 @@ int direct_disc_unmap(unsigned long from, unsigned long first_pg, int tot_pages) struct list_head * curr; struct list_head * direct_list = ¤t->mm->context.direct_list; - printk(KERN_ALERT "bd240 debug: direct_disc_unmap\n"); - curr = direct_list->next; while(curr != direct_list){ node = list_entry(curr, direct_mmap_node_t, list); @@ -350,13 +342,9 @@ int direct_disc_unmap(unsigned long from, unsigned long first_pg, int tot_pages) if(curr == direct_list) return -1; - printk(KERN_ALERT "bd240 debug: direct_disc_unmap, deleted from direct_list\n"); - list_del(&node->list); kfree(node); - printk(KERN_ALERT "bd240 debug: direct_disc_unmap, from %lx, tot_pages %lx\n", from, tot_pages); - while(count < tot_pages){ direct_zap_page_range(current->mm, from, PAGE_SIZE); from += PAGE_SIZE; diff --git a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h index a0f32036ec..dbb0b3ac72 100644 --- a/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h +++ b/xenolinux-2.4.16-sparse/arch/xeno/drivers/dom0/dom0_ops.h @@ -1,4 +1,3 @@ - /****************************************************************************** * dom0_ops.h * @@ -18,9 +17,10 @@ typedef struct dom0_newdomain_st { + unsigned int domain; unsigned int memory_kb; unsigned int num_vifs; // temporary - unsigned int domain; // return parameter + unsigned long pg_head; // return parameter } dom0_newdomain_t; typedef struct dom0_killdomain_st @@ -34,12 +34,13 @@ typedef struct dom0_map_ts unsigned long ts_phy_addr; } dom0_tsmap_t; -typedef struct dom_mem_req +typedef struct dom_mem { unsigned int domain; + unsigned long vaddr; unsigned long start_pfn; int tot_pages; -} dom_mem_req_t; +} dom_mem_t; typedef struct domain_launch { @@ -48,6 +49,9 @@ typedef struct domain_launch unsigned long virt_load_addr; unsigned long virt_shinfo_addr; unsigned long virt_startinfo_addr; + unsigned long pgt_update_arr; + unsigned long num_pgt_updates; + unsigned int num_vifs; char cmd_line[MAX_CMD_LEN]; } dom_meminfo_t; @@ -59,7 +63,8 @@ typedef struct dom0_op_st dom0_newdomain_t newdomain; dom0_killdomain_t killdomain; dom0_tsmap_t mapdomts; - dom_mem_req_t reqdommem; + dom_mem_t dommem; + dom_meminfo_t meminfo; } u; } dom0_op_t; -- 2.30.2